package com.itbupt.domain.activity.repository;

import com.itbupt.domain.activity.model.aggregate.CreatePartakeOrderAggregate;
import com.itbupt.domain.activity.model.aggregate.CreateQuotaOrderAggregate;
import com.itbupt.domain.activity.model.entity.*;
import com.itbupt.domain.activity.model.valobj.ActivitySkuStockKeyVO;

import java.math.BigDecimal;
import java.util.Date;
import java.util.List;

/**
 * @Author dingchang
 * @Date 2025/3/30 22:50
 * @Description: 活动仓储接口
 */
public interface IActivityRepository {

    /**
     * 通过商品sku查询查询活动sku信息
     * @param sku  商品sku
     * @return
     */
    ActivitySkuEntity queryActivitySku(Long sku);

    /**
     * 根据活动ID查询活动详细信息并写入缓存
     * @param activityId 活动ID
     * @return ActivityEntity
     */
    ActivityEntity queryRaffleActivityByActivityId(Long activityId);

    /**
     * 根据活动ID查询活动次数信息（用户在活动上可参与的次数）
     * @param activityCountId 活动ID
     * @return ActivityCountEntity
     */
    ActivityCountEntity queryRaffleActivityCountByActivityCountId(Long activityCountId);

    /**
     * 缓存库存总量
     * @param cacheKey sku和库存总量
     * @param stockCount
     */
    void cacheActivitySkuStockCount(String cacheKey, Integer stockCount);

    /**
     * 根据策略ID和奖品ID，扣减奖品缓存库存
     * @param sku 活动SKU
     * @param cacheKey key
     * @param endDateTime 活动结束时间，根据结束时间设置加锁的key为结束时间
     * @return 扣减结果
     */
    boolean subtractionActivitySkuStock(Long sku, String cacheKey, Date endDateTime);

    /**
     * 活动sku库存消费发送到延迟队列
     * @param activitySkuStockKeyVO 活动sku库存key值对象
     */
    void activitySkuStockConsumeSendQueue(ActivitySkuStockKeyVO activitySkuStockKeyVO);

    // 获取消息队列中的活动sku库存key值对象
    ActivitySkuStockKeyVO takeQueueValue();

    // 清空消息队列
    void clearQueueValue();

    // 延迟队列 + 任务趋势更新活动sku库存
    void updateActivitySkuStock(Long sku);

    // 当缓存库存消耗完毕时，清空数据库库存
    void clearActivitySkuStock(Long sku);

    /**
     * 查询未被使用的活动参与订单记录
     * @param partakeRaffleActivityEntity 参与抽奖活动实体对象
     * @return 抽奖订单实体对象
     */
    UserRaffleOrderEntity queryNoUsedRaffleOrder(PartakeRaffleActivityEntity partakeRaffleActivityEntity);

    // 保存参与活动订单聚合对象
    void saveCreatePartakeOrderAggregate(CreatePartakeOrderAggregate createPartakeOrderAggregate);

    // 查询活动账户里面的总账户额度
    ActivityAccountEntity queryActivityAccountByUserId(String userId, Long activityId);

    // 查询月账户额度
    ActivityAccountMonthEntity queryActivityAccountMonthByUserId(String userId, Long activityId, String month);

    // 查询日账户额度
    ActivityAccountDayEntity queryActivityAccountDayByUserId(String userId, Long activityId, String day);

    // 查询活动sku列表
    List<ActivitySkuEntity> queryActivitySkuListByActivityId(Long activityId);

    // 查询日参与次数
    Integer queryRaffleActivityAccountDayPartakeCount(Long activityId, String userId);

    // 查询账户额度
    ActivityAccountEntity queryActivityAccountEntity(Long activityId, String userId);

    // 查询用户抽奖总次数
    Integer queryRaffleActivityAccountPartakeCount(Long activityId, String userId);

    // 无需支付，直接充值到账
    void doSaveNoPayOrder(CreateQuotaOrderAggregate createOrderAggregate);

    // 使用积分支付
    void doSaveCreditPayOrder(CreateQuotaOrderAggregate createOrderAggregate);

    // 订单出货 - 积分充值
    void updateOrder(DeliveryOrderEntity deliveryOrderEntity);

    // 查询账户额度
    BigDecimal queryUserCreditAccountAmount(String userId);

    // 查询未支付订单
    UnpaidActivityOrderEntity queryUnpaidActivityOrder(SkuRechargeEntity skuRechargeEntity);

    // 查询当前活动ID下，创建的 sku 商品
    List<SkuProductEntity> querySkuProductEntityListByActivityId(Long activityId);

}
